package ihm;

import controller.algorithme.Algorithme;
import controller.SimulationControleur;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

/**
 * Classe qui affiche, dans la partie gauche de la fenêtre, le panel nommé "Charger un fichier de simulation".
 * 
 * @author Jason
 */
public class PanelFichierSimulation extends JPanel {
    private static final long serialVersionUID = 1L;

    private final String CHARGER_FICHIER_SIMULATION = "Charger un fichier de simulation";
    private final String ALGORITHME = "Algorithme : ";
    private final String PARCOURIR = "Parcourir";
    private final String TRAJET_PLUS_COURT = "Trajet le plus court";
    private final String ECONOMIE_ENERGIE = "Economie d'énergie";
    private final String AUTOMATIQUE = "Automatique";

    private Font policeTitres = new Font("Dialog",Font.BOLD,14);

    private JLabel lblFichierSimulation;
    private JLabel lblAlgorithme;

    private ButtonGroup groupFichierSimu;
    private JRadioButton rbFichierSimuTrajetPlusCourt;
    private JRadioButton rbFichierSimuEconomieEnergie;
    private JRadioButton rbFichierSimuAutomatique;

    private JTextField tfCheminFichier;

    private JButton btnParcourir;

    private JPanel panelParcourir;

    private SimulationControleur simuControleur;

    /**
     * Constructeur.
     */
    public PanelFichierSimulation(SimulationControleur simuControleur) {
        this.simuControleur = simuControleur;

        lblFichierSimulation = new JLabel(CHARGER_FICHIER_SIMULATION);
        lblFichierSimulation.setFont(policeTitres);

        lblAlgorithme = new JLabel(ALGORITHME);

        rbFichierSimuTrajetPlusCourt = new JRadioButton(TRAJET_PLUS_COURT);
        rbFichierSimuEconomieEnergie = new JRadioButton(ECONOMIE_ENERGIE);
        rbFichierSimuAutomatique = new JRadioButton(AUTOMATIQUE);

        tfCheminFichier = new JTextField();
        btnParcourir = new JButton(PARCOURIR);

        //Construction du groupe de radioButtons.
        groupFichierSimu = new ButtonGroup();
        groupFichierSimu.add(rbFichierSimuTrajetPlusCourt);
        groupFichierSimu.add(rbFichierSimuEconomieEnergie);
        groupFichierSimu.add(rbFichierSimuAutomatique);

        creerMarges();
        creerPanelParcourir();
        definirLayout();
        chargerFichierSimulation(this);
        ajouterEcouteurBRAlgo();
    }

    /**
     * Créé les marges qui permettent de créer un espace autour du contenu du panel.
     */
    private void creerMarges() {
        this.setBorder(
                            BorderFactory.createEmptyBorder(
                                            20,20,20,20
                            )
            );
    }

    /**
     * Construit le bouton Parcourir et sa zone de texte associée.
     */
    private void creerPanelParcourir() {

        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();
        panelParcourir = new JPanel();

        //gridx : gestion des colonnes.
        //gridy : gestion des lignes.
        panelParcourir.setLayout(gbl);

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.ipadx = 230;
        gbc.ipady = 7;
        panelParcourir.add(tfCheminFichier, gbc);
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.ipadx = 40;
        gbc.ipady = 0;
        panelParcourir.add(btnParcourir, gbc);
    }

    /**
     * Mise en forme du panel.
     */
    private void definirLayout() {
            GroupLayout layout = new GroupLayout(this);
            this.setLayout(layout);

            layout.setHorizontalGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.CENTER)
                                    .addComponent(lblFichierSimulation)
                                    .addComponent(lblAlgorithme)
                            .addGroup(layout.createSequentialGroup()
                                    .addComponent(rbFichierSimuTrajetPlusCourt)
                                    .addComponent(rbFichierSimuEconomieEnergie)
                                    .addComponent(rbFichierSimuAutomatique)
                            )
                                    .addComponent(panelParcourir)
            );

            layout.setVerticalGroup(
        layout.createSequentialGroup()
                                    .addComponent(lblFichierSimulation)
                                    .addComponent(lblAlgorithme)
                            .addGroup(layout.createParallelGroup()
                                            .addComponent(rbFichierSimuTrajetPlusCourt)
                                            .addComponent(rbFichierSimuEconomieEnergie)
                                            .addComponent(rbFichierSimuAutomatique)
                            )
                                    .addComponent(panelParcourir)
            );
    }

    /**
     * Gestion de la sélection du fichier de simulation à charger dans le logiciel.
     * 
     * @param panelFichierSimulation	référence au panelFichierSimulation.
     */
    private void chargerFichierSimulation(final PanelFichierSimulation panelFichierSimulation) {
            btnParcourir.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                            JFileChooser fileChooser = new JFileChooser();
                            int fichierSelectionne = fileChooser.showOpenDialog(panelFichierSimulation);
                            if(fichierSelectionne == JFileChooser.APPROVE_OPTION) {
                                    tfCheminFichier.setText(fileChooser.getSelectedFile().getAbsolutePath());
                                    simuControleur.setCheminFichierSimulation(fileChooser.getSelectedFile().getAbsolutePath());
                                    simuControleur.setAlgo(getAlgoChoisi());
                            }
                    }
            });
    }

    /**
     * @return Retourne la valeur de la constante de l'algo choisi
     */
    private int getAlgoChoisi() {
        if(rbFichierSimuAutomatique.isSelected()) {
            return Algorithme.MODE_AUTOMATIQUE;
        } else if (rbFichierSimuEconomieEnergie.isSelected()) {
            return Algorithme.ECONOMIE_ENERGIE;
        } else if (rbFichierSimuTrajetPlusCourt.isSelected()) {
            return Algorithme.LE_PLUS_COURT;
        }
        return Algorithme.MODE_AUTOMATIQUE;
    }
    
    /**
     * Ajout des écouteurs sur les boutons radios qui permettent de choisir
     * l'algo désiré
     */
    private void ajouterEcouteurBRAlgo() {
        rbFichierSimuAutomatique.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                simuControleur.setAlgo(Algorithme.MODE_AUTOMATIQUE);
                System.out.println("MODE AUTO");
            }
        });
        rbFichierSimuEconomieEnergie.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                simuControleur.setAlgo(Algorithme.ECONOMIE_ENERGIE);
                System.out.println("Algo économie d'énergie");
            }
        });
        rbFichierSimuTrajetPlusCourt.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                simuControleur.setAlgo(Algorithme.LE_PLUS_COURT);
                System.out.println("Algo le plus court");
            }
        });
    }
}